package com.buaa.divinationmaster.core.database.dao;

import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import androidx.room.Update;

import com.buaa.divinationmaster.core.database.entities.LenormandCard;

import java.util.List;

/**
 * 雷诺曼卡牌数据访问对象 (DAO)
 * 提供36张雷诺曼卡牌的CRUD操作和查询功能
 */
@Dao
public interface LenormandCardDao {
    
    /**
     * 获取所有雷诺曼卡牌，按编号排序
     * @return LiveData包装的雷诺曼卡牌列表
     */
    @Query("SELECT * FROM lenormand_cards ORDER BY number")
    LiveData<List<LenormandCard>> getAllCards();
    
    /**
     * 获取所有雷诺曼卡牌 (同步方法)
     * @return 雷诺曼卡牌列表
     */
    @Query("SELECT * FROM lenormand_cards ORDER BY number")
    List<LenormandCard> getAllCardsSync();
    
    /**
     * 根据ID获取特定雷诺曼卡牌
     * @param cardId 卡牌ID (1-36)
     * @return 雷诺曼卡牌对象
     */
    @Query("SELECT * FROM lenormand_cards WHERE id = :cardId")
    LenormandCard getCardById(int cardId);
    
    /**
     * 根据编号获取雷诺曼卡牌
     * @param number 卡牌编号 (1-36)
     * @return 雷诺曼卡牌对象
     */
    @Query("SELECT * FROM lenormand_cards WHERE number = :number")
    LenormandCard getCardByNumber(int number);
    
    /**
     * 根据ID列表获取多张雷诺曼卡牌
     * @param cardIds 卡牌ID列表
     * @return 雷诺曼卡牌列表
     */
    @Query("SELECT * FROM lenormand_cards WHERE id IN (:cardIds) ORDER BY number")
    List<LenormandCard> getCardsByIds(List<Integer> cardIds);
    
    /**
     * 根据编号列表获取多张雷诺曼卡牌
     * @param numbers 卡牌编号列表
     * @return 雷诺曼卡牌列表
     */
    @Query("SELECT * FROM lenormand_cards WHERE number IN (:numbers) ORDER BY number")
    List<LenormandCard> getCardsByNumbers(List<Integer> numbers);
    
    /**
     * 根据中文名或英文名搜索卡牌
     * @param searchQuery 搜索关键词
     * @return 匹配的雷诺曼卡牌列表
     */
    @Query("SELECT * FROM lenormand_cards WHERE name_zh LIKE '%' || :searchQuery || '%' OR name_en LIKE '%' || :searchQuery || '%' ORDER BY number")
    List<LenormandCard> searchCardsByName(String searchQuery);
    
    /**
     * 根据关键词搜索卡牌
     * @param keyword 关键词
     * @return 匹配的雷诺曼卡牌列表
     */
    @Query("SELECT * FROM lenormand_cards WHERE keywords LIKE '%' || :keyword || '%' ORDER BY number")
    List<LenormandCard> searchByKeywords(String keyword);
    
    /**
     * 根据含义搜索卡牌 (搜索各种含义字段)
     * @param searchQuery 搜索内容
     * @return 匹配的雷诺曼卡牌列表
     */
    @Query("SELECT * FROM lenormand_cards WHERE meaning LIKE '%' || :searchQuery || '%' OR positive_meaning LIKE '%' || :searchQuery || '%' OR negative_meaning LIKE '%' || :searchQuery || '%' ORDER BY number")
    List<LenormandCard> searchByMeaning(String searchQuery);
    
    /**
     * 根据主题获取相关卡牌 (感情/事业/健康)
     * @param theme 主题关键词
     * @return 相关的雷诺曼卡牌列表
     */
    @Query("SELECT * FROM lenormand_cards WHERE love_meaning LIKE '%' || :theme || '%' OR career_meaning LIKE '%' || :theme || '%' OR health_meaning LIKE '%' || :theme || '%' ORDER BY number")
    List<LenormandCard> getCardsByTheme(String theme);
    
    /**
     * 获取有正面含义的卡牌
     * @return 正面含义的雷诺曼卡牌列表
     */
    @Query("SELECT * FROM lenormand_cards WHERE positive_meaning IS NOT NULL AND positive_meaning != '' ORDER BY number")
    List<LenormandCard> getPositiveCards();
    
    /**
     * 获取有负面含义的卡牌
     * @return 负面含义的雷诺曼卡牌列表
     */
    @Query("SELECT * FROM lenormand_cards WHERE negative_meaning IS NOT NULL AND negative_meaning != '' ORDER BY number")
    List<LenormandCard> getNegativeCards();
    
    /**
     * 根据时间含义获取卡牌
     * @param timePeriod 时间周期关键词
     * @return 相关时间含义的雷诺曼卡牌列表
     */
    @Query("SELECT * FROM lenormand_cards WHERE timing LIKE '%' || :timePeriod || '%' ORDER BY number")
    List<LenormandCard> getCardsByTiming(String timePeriod);
    
    /**
     * 获取指定范围内的卡牌
     * @param startNumber 开始编号
     * @param endNumber 结束编号
     * @return 指定范围的雷诺曼卡牌列表
     */
    @Query("SELECT * FROM lenormand_cards WHERE number >= :startNumber AND number <= :endNumber ORDER BY number")
    List<LenormandCard> getCardsByNumberRange(int startNumber, int endNumber);
    
    /**
     * 获取随机雷诺曼卡牌 (用于洗牌算法)
     * @param limit 限制数量
     * @return 随机雷诺曼卡牌列表
     */
    @Query("SELECT * FROM lenormand_cards ORDER BY RANDOM() LIMIT :limit")
    List<LenormandCard> getRandomCards(int limit);
    
    /**
     * 获取适合感情占卜的卡牌
     * @return 感情相关的雷诺曼卡牌列表
     */
    @Query("SELECT * FROM lenormand_cards WHERE love_meaning IS NOT NULL AND love_meaning != '' ORDER BY number")
    List<LenormandCard> getLoveCards();
    
    /**
     * 获取适合事业占卜的卡牌
     * @return 事业相关的雷诺曼卡牌列表
     */
    @Query("SELECT * FROM lenormand_cards WHERE career_meaning IS NOT NULL AND career_meaning != '' ORDER BY number")
    List<LenormandCard> getCareerCards();
    
    /**
     * 获取适合健康占卜的卡牌
     * @return 健康相关的雷诺曼卡牌列表
     */
    @Query("SELECT * FROM lenormand_cards WHERE health_meaning IS NOT NULL AND health_meaning != '' ORDER BY number")
    List<LenormandCard> getHealthCards();
    
    /**
     * 根据符号搜索卡牌
     * @param symbol 符号描述
     * @return 匹配符号的雷诺曼卡牌列表
     */
    @Query("SELECT * FROM lenormand_cards WHERE symbol LIKE '%' || :symbol || '%' ORDER BY number")
    List<LenormandCard> getCardsBySymbol(String symbol);
    
    /**
     * 获取有组合解读要点的卡牌
     * @return 有组合要点的雷诺曼卡牌列表
     */
    @Query("SELECT * FROM lenormand_cards WHERE combination_notes IS NOT NULL AND combination_notes != '' ORDER BY number")
    List<LenormandCard> getCardsWithCombinationNotes();
    
    /**
     * 插入所有雷诺曼卡牌 (批量插入，用于初始化数据)
     * @param cards 雷诺曼卡牌列表
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertAll(List<LenormandCard> cards);
    
    /**
     * 插入单张雷诺曼卡牌
     * @param card 雷诺曼卡牌对象
     * @return 插入的行ID
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    long insert(LenormandCard card);
    
    /**
     * 更新雷诺曼卡牌信息
     * @param card 雷诺曼卡牌对象
     */
    @Update
    void update(LenormandCard card);
    
    /**
     * 删除雷诺曼卡牌
     * @param card 雷诺曼卡牌对象
     */
    @Delete
    void delete(LenormandCard card);
    
    /**
     * 获取雷诺曼卡牌总数
     * @return 总数 (应该是36)
     */
    @Query("SELECT COUNT(*) FROM lenormand_cards")
    int getCardCount();
    
    /**
     * 检查雷诺曼数据是否已初始化
     * @return 是否已初始化
     */
    @Query("SELECT COUNT(*) >= 36 FROM lenormand_cards")
    boolean isDataInitialized();
    
    /**
     * 获取编号最大的卡牌 (应该是36号)
     * @return 最大编号
     */
    @Query("SELECT MAX(number) FROM lenormand_cards")
    int getMaxCardNumber();
    
    /**
     * 获取编号最小的卡牌 (应该是1号)
     * @return 最小编号
     */
    @Query("SELECT MIN(number) FROM lenormand_cards")
    int getMinCardNumber();
    
    /**
     * 获取所有不重复的符号
     * @return 符号列表
     */
    @Query("SELECT DISTINCT symbol FROM lenormand_cards WHERE symbol IS NOT NULL AND symbol != '' ORDER BY symbol")
    List<String> getAllSymbols();
    
    /**
     * 获取所有中文名称
     * @return 中文名称列表
     */
    @Query("SELECT name_zh FROM lenormand_cards ORDER BY number")
    List<String> getAllChineseNames();
    
    /**
     * 获取所有英文名称
     * @return 英文名称列表
     */
    @Query("SELECT name_en FROM lenormand_cards ORDER BY number")
    List<String> getAllEnglishNames();
    
    /**
     * 验证编号唯一性 (检查是否有重复编号)
     * @return 唯一编号的数量 (应该等于总数)
     */
    @Query("SELECT COUNT(DISTINCT number) FROM lenormand_cards")
    int getUniqueNumberCount();
    
    /**
     * 清空所有雷诺曼卡牌数据 (用于重新初始化)
     */
    @Query("DELETE FROM lenormand_cards")
    void deleteAll();
}
